#!/bin/sh

[ "$VERBOSITY" = 1 ] && set -x

sysfs()
{
	# Called with :
	# $1 = value to write. Won't write if $1 is empty.
	# $2 = basename of the file in bonding/ to write to.
	if [ "$1" ] ; then
		echo "$1" > "/sys/class/net/$IFACE/master/bonding/$2"
		return $?
	fi
	return 0
}

sysfs_remove_all()
{
	# Called with:
	# $1 = target filename
	read values < "/sys/class/net/$IFACE/bonding/$1"
	for value in $values ; do
		echo "-$value" > "/sys/class/net/$IFACE/bonding/$1"
	done
}

BOND_PARAMS="/sys/class/net/$IFACE/bonding"
IFSTATE=/var/run/ifstate

# free $IFACE if it is currently enslaved to a bonding device.
if [ -f "/sys/class/net/$IFACE/master/bonding/slaves" ] ; then
	echo "-$IFACE" > "/sys/class/net/$IFACE/master/bonding/slaves"

	# The first slave in bond-primary found in current slaves becomes the primary.
	# If no slave in bond-primary is found, then primary does not change and might be undefined if just removed.
	for slave in $IF_BOND_PRIMARY ; do
		if grep -sq "\\<$slave\\>" "/sys/class/net/$IFACE/master/bonding/slaves" ; then
			sysfs "$slave" primary
			break
		fi
	done
fi

# If $IFACE is not a master, exit.
[ ! -f "$BOND_PARAMS/slaves" ] && exit

# Unset multivalue sysfs entries, so that re-enabling the interface later won't cause error.

sysfs_remove_all arp_ip_target

# Remove any slaves of $IFACE.

[ "$VERBOSITY" = 1 ] && v=-v
read slaves < "$BOND_PARAMS/slaves"
for slave in $slaves ; do
	# If $slave is currently up in $IFSTATE, then bring it down, to keep $IFSTATE consistent.
	# This is supposed to have the side effect of freeing the interface.
	grep -q "^$slave=" $IFSTATE && ifdown $v $slave

	# Anyway, ensure $slave is free.
	if [ -f "/sys/class/net/$slave/master/bonding/slaves" ] ; then
		echo "-$slave" > "$BOND_PARAMS/slaves" 2> /dev/null
	fi
done

# make sure that the link is set to down
ip link set dev $IFACE down
